Add Alloy infrastructure, context system, and field components#77
Open
FionaBronwen wants to merge 5 commits into
Open
Conversation
8f1da87 to
8b51ca4
Compare
8b51ca4 to
8f411e1
Compare
Introduce the foundation for the component-based GraphQL emitter: - Build/config: Add @alloy-js/core, @alloy-js/graphql dependencies, configure JSX transpilation (tsconfig, vitest) - Context system: GraphQLSchemaContext with ClassifiedTypes, ModelVariants, and ScalarVariant interfaces - Field components: Field, OperationField, and GraphQLTypeExpression for rendering model properties and operations as GraphQL SDL - Type resolution: GraphQLTypeExpression handles scalars, models, enums, unions, arrays, and nullability using an isInput prop to distinguish input vs output context - Scalar mappings: Add getGraphQLBuiltinName() for built-in scalar identity checks
8f411e1 to
5f26c25
Compare
The ModelVariants lookup structure was originally designed to help components decide when to append "Input" suffix to model names. However, the mutation engine now fully handles this: - Input models are mutated with the "Input" suffix already applied - Property type references are rewired to point to the correct variants This commit removes the unused ModelVariants interface and the lookup logic from GraphQLTypeExpression, simplifying the component to just use the model's name directly. Also adds unionMembers to context (needed for union rendering).
Remove unused utility functions that were superseded by the mutation engine: - getTemplatedModelName (mutation engine handles template naming) - getSingleNameWithNamespace (never used in production) - isArray, isRecordType, isScalarOrEnumArray, isUnionArray (use compiler's isArrayModelType) - unwrapModel, unwrapType (never imported) - isTrueModel (never imported) Also removes the corresponding test for getSingleNameWithNamespace.
swatkatz
reviewed
May 13, 2026
swatkatz
reviewed
May 13, 2026
swatkatz
reviewed
May 13, 2026
Remove ClassifiedTypes, ScalarVariant, unionMembers, and scalarSpecifications from GraphQLSchemaContextValue. The context now holds a single TypeGraph — a self-contained namespace of mutated types that downstream components can walk directly. Classification (input/output/interface) and scalar metadata are derived from the TypeGraph at render time rather than pre-computed into parallel arrays and side-channel maps.
Per the GraphQL spec, 'nullability directly determines whether a field is required'. Optional fields (?) should be nullable in both input and output contexts. The previous logic made optional input fields non-null, which: 1. Violated the GraphQL specification 2. Caused crashes on circular references (e.g., Author.friend?: Author became AuthorInput.friend: AuthorInput!, an invalid non-null cycle)
FionaBronwen
added a commit
that referenced
this pull request
Jun 3, 2026
After the TypeGraph refactor in PR #77, ScalarVariant was removed from the context module. Move it to schema-mutator.ts where it belongs since it's part of the MutatedSchema interface.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds the Alloy component infrastructure for the GraphQL emitter:
@alloy-js/core,@alloy-js/graphql)TspContextintegration from@typespec/emitter-frameworkfor program/typekit accessGraphQLSchemaContextwith aTypeGraphinterface — the mutation pipeline's output contractFieldandOperationFieldcomponents for rendering GraphQL fieldsGraphQLTypeExpressioncomponent for resolving TypeSpec types to GraphQL type strings (handles scalars, models, enums, unions, arrays, nullability)The schema context holds a
TypeGraph({ readonly globalNamespace: Namespace }) — a self-contained namespace of mutated types. Downstream components walk the namespace directly rather than consuming pre-classified arrays or side-channel maps.Key design decisions
Test plan